package com.priox.sigar.jsf;

import com.mm.seguridad.domain.model.Estado;
import com.mm.support.domain.TipoUsuario;
import com.mm.seguridad.domain.model.Usuario;
import com.mm.seguridad.dto.UsuarioDTO;
import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.mappers.GrupoEmpresarialMapper;
import com.priox.sigar.application.mappers.UsuarioMapper;
import com.priox.sigar.application.usuario.RegistroUsuarioApp;
import com.priox.sigar.client.dto.GrupoEmpresarialDTO;
import com.priox.sigar.jsf.util.FindCrudBeanBase;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.CloseEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


@ManagedBean
@Scope("session")
@Component
public class MaestroUsuarioJsfBean extends FindCrudBeanBase {

    UsuarioDTO filtroBusqueda;
    UsuarioDTO nuevoRegistro;
    GrupoEmpresarialDTO nuevoGrupoEmpresarial;
    GrupoEmpresarialDTO filtroGrupo;

    List<UsuarioDTO> registros = new ArrayList<UsuarioDTO>();

    @Autowired
    UsuarioMapper usuarioMapper;

    @Autowired
    GrupoEmpresarialMapper grupoEmpresarialMapper;

    @Autowired
    DTOMapperService mapperService;

    @Autowired
    RegistroUsuarioApp registroUsuarioApp;

    protected List<GrupoEmpresarialDTO> cmbGrupoEmpresarial;


    @PostConstruct
    public void init() {
        filtroBusqueda = new UsuarioDTO();
        nuevoRegistro = new UsuarioDTO();
        cmbGrupoEmpresarial = grupoEmpresarialMapper.findAll();
        findRegistros();
    }

    /*Métodos de herencia*/

    @Override
    public void setCursorTableNull() {

    }

    @Override
    public void onNewRecord(ActionEvent actionEvent) {
        setUpdateMode(false);
        nuevoRegistro = new UsuarioDTO();
        InputText inputText = (InputText) findComponent("inputLogin");
        inputText.setDisabled(false);
    }

    @Override
    public void onFind(ActionEvent actionEvent) {
        findRegistros();
    }

    public void findRegistros() {

        if (filtroGrupo != null) {
            filtroBusqueda.setGrupoEmpresarialId(filtroGrupo.getGrupoEmpresarialId());
        } else {
            filtroBusqueda.setGrupoEmpresarialId(null);
        }
        registros = usuarioMapper.findAll(filtroBusqueda);
        if (registros.size() == 0) {
            addMessage(noRecordFoundMsg, FacesMessage.SEVERITY_INFO);
        }

    }

    public TipoUsuario[] getAllTipoUsuario() {
        Object[] result= Arrays.asList(TipoUsuario.ADMINISTRADOR,TipoUsuario.USUARIO).toArray();
        return (TipoUsuario[]) result;
    }


    @Override
    public void onClean(ActionEvent actionEvent) {
        registros = new ArrayList<UsuarioDTO>();
        nuevoRegistro = new UsuarioDTO();
        filtroBusqueda = new UsuarioDTO();
        filtroGrupo = new GrupoEmpresarialDTO();
    }

    public void onSelectTipoUsuario(AjaxBehaviorEvent actionEvent) {
        SelectOneMenu cmb=(SelectOneMenu)findComponent("cmbGrupoEmpresarialUsuario");

        nuevoGrupoEmpresarial=null;
        if(TipoUsuario.ADMINISTRADOR.equals(nuevoRegistro.getTipoUsuario())){
            cmb.setDisabled(true);
            cmb.setRequired(false);
        }else{
            cmb.setDisabled(false);
            cmb.setRequired(true);
        }
    }

    @Override
    public void onPersist(ActionEvent actionEvent) {
        Usuario usuario = mapperService.map(nuevoRegistro, Usuario.class);
        if(nuevoGrupoEmpresarial!=null){
            usuario.setGrupoEmpresarialId(nuevoGrupoEmpresarial.getGrupoEmpresarialId());
        } else{
            usuario.setGrupoEmpresarialId(null);
        }
        registroUsuarioApp.save(usuario, updateMode);
        findRegistros();
    }

    private boolean habilitarGrupo;
    @Override
    public void initForm(ActionEvent actionEvent) {

    }

    @Override
    public void onShowEditDialog(ActionEvent actionEvent) {
        setUpdateMode(true);
        setPersistMode(true);
        nuevoRegistro = usuarioMapper.findById(nuevoRegistro.getUsuarioId());
        nuevoGrupoEmpresarial=grupoEmpresarialMapper.findById(nuevoRegistro.getGrupoEmpresarialId());
        InputText inputText = (InputText) findComponent("inputLogin");
        inputText.setDisabled(true);
        SelectOneMenu cmb=(SelectOneMenu)findComponent("cmbGrupoEmpresarialUsuario");
        if(TipoUsuario.ADMINISTRADOR.equals(nuevoRegistro.getTipoUsuario())){
            cmb.setDisabled(true);
            cmb.setRequired(false);
        }else{
            cmb.setDisabled(false);
            cmb.setRequired(true);
        }
    }


    @Override
    public void onDelete(ActionEvent actionEvent) {
        Usuario usuario=mapperService.map(nuevoRegistro,Usuario.class);
        registroUsuarioApp.delete(usuario);
    }

    @Override
    protected void onDialogClose(CloseEvent event) {
        nuevoRegistro = new UsuarioDTO();
    }




    /*Getters and Setters*/

    public UsuarioDTO getFiltroBusqueda() {
        return filtroBusqueda;
    }

    public void setFiltroBusqueda(UsuarioDTO filtroBusqueda) {
        this.filtroBusqueda = filtroBusqueda;
    }

    public UsuarioDTO getNuevoRegistro() {
        return nuevoRegistro;
    }

    public void setNuevoRegistro(UsuarioDTO nuevoRegistro) {
        this.nuevoRegistro = nuevoRegistro;
    }

    public List<UsuarioDTO> getRegistros() {
        return registros;
    }

    public void setRegistros(List<UsuarioDTO> registros) {
        this.registros = registros;
    }

    public List<GrupoEmpresarialDTO> getCmbGrupoEmpresarial() {
        return cmbGrupoEmpresarial;
    }

    public void setCmbGrupoEmpresarial(List<GrupoEmpresarialDTO> cmbGrupoEmpresarial) {
        this.cmbGrupoEmpresarial = cmbGrupoEmpresarial;
    }

    public GrupoEmpresarialDTO getFiltroGrupo() {
        return filtroGrupo;
    }

    public void setFiltroGrupo(GrupoEmpresarialDTO filtroGrupo) {
        this.filtroGrupo = filtroGrupo;
    }

    public GrupoEmpresarialDTO getNuevoGrupoEmpresarial() {
        return nuevoGrupoEmpresarial;
    }

    public void setNuevoGrupoEmpresarial(GrupoEmpresarialDTO nuevoGrupoEmpresarial) {
        this.nuevoGrupoEmpresarial = nuevoGrupoEmpresarial;
    }
    public Estado[] getAllEstado(){
        return Estado.values();
    }
}
